package com.geek.javase.ch17.work.tcpwork.tcp6;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;
import java.util.concurrent.locks.LockSupport;

/*
 *@Date 2025/11/4
 *@Author wangpeng
 *@Description
 *读写撤离
 * 读取线程类 - 负责从客户端Socket读取数据
 * 实现Runnable接口，用于处理客户端发送的消息
 * 采用"读写撤离"设计模式，专门负责读取操作
 */
public class ReadThread implements Runnable{
    // 客户端Socket连接对象，用于与特定客户端通信
    private Socket socket;
    // 当前运行的线程引用，用于线程间协作
    private Thread currentThread;
    //构造方法，初始化客户端Socket连接
    public ReadThread(Socket socket) {
        this.socket = socket;
    }
    //线程执行方法，持续监听并读取客户端发送的消息
    //当读取到"exit"消息或发生异常时终止线程
    @Override
    public void run() {
        // 使用try-with-resources语句自动管理资源，确保流正确关闭
        try(
                // 创建字符缓冲输入流，包装Socket的字节输入流
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        ){
            String str = null;
            // 循环读取客户端发送的每一行消息，直到连接断开或无数据可读
            while((str= br.readLine())!=null){
                if(str.equals("exit")){
                    System.out.println(socket.getRemoteSocketAddress()+"已下线！");
                    break;// 跳出循环，结束读取线程
                }else{
                    System.out.println(socket.getRemoteSocketAddress()+"说："+str);
                }
            }
        }catch (SocketException e){
            // 处理Socket异常，通常是客户端异常断开导致的
            System.out.println(socket.getRemoteSocketAddress()+"已下线！");
        }catch (Exception e){
            // 处理其他可能发生的异常
            e.printStackTrace();
        }finally {
            // 唤醒被阻塞的线程（可能是主线程）
            LockSupport.unpark(currentThread);
            // 确保Socket连接被正确关闭
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
